In diesem Kapitel simulieren wir mit eines Random Walks die Bewegung von Pollen. Die Basis hierfür bildet der zweidimensionale Random Walk aus Kapitel 1, den wir einigen Änderungen unterziehen. Anders als beim zweidimensionalen Random Walk, bei dem wir nur die Bewegung eines einzelnen Partikels betrachten, betrachten wir hier die Bewegungen mehrerer Partikel gleichzeitig.
import numpy as np
import random as rd
import plotly.graph_objects as go
numpar = 1000
numStep = 100
NORTH = 1; SOUTH = 2; WEST = 3; EAST = 4
Die Imports sowie die Konstanten zur Bestimmung der Richtungen bleiben unverändert im Vergleich zu unserer Vorlage. Wir können sie also einfach übernehmen.
def singleStep():
position = np.zeros(shape=(2,), dtype=int)
currentStep = rd.randint(1, 4 + 1)
position[1] += np.where(currentStep == NORTH, 1, 0)
position[1] -= np.where(currentStep == SOUTH, 1, 0)
position[0] += np.where(currentStep == EAST, 1, 0)
position[0] -= np.where(currentStep == WEST, 1, 0)
return position
def walkSteps(numStep):
positionsArray = np.zeros(shape=(numStep+1, 2), dtype=int)
for step in np.arange(numStep):
positionsArray[step+1, ] = positionsArray[step, ] + singleStep()
return positionsArray
Die Methoden singleStep und walkSteps bleiben ebenfalls unverändert und können einfach übernommen werden. Mit singleStep erhalten wir wieder einen einzelnen Schritt, mit desssen Hilfe wir in walkSteps aus dem vorherigen Schritt und dem Wert aus singleStep die aktuelle Position berechnen können. Dies machen wir so oft wie Schritte vorgegeben sind und erhalten einen Partikel als Ergebnis.
def drawTraces(numpar, numStep):
fig = go.Figure(data=go.Scatter(
mode='markers',
name='Draw pollen motion'))
for step in np.arange(numpar):
posArray = walkSteps(numStep)
fig.add_trace(
go.Scatter(
x=posArray[:, 0],
y=posArray[:, 1],
marker=dict(
color=np.arange(numpar),
size=5,
colorscale='Greens',
showscale=False)))
fig.show()
Die Methode drawTraces ersetzt hier die Methode drawWalk aus unserer Vorlage. Wir übergeben ihr das Parameter numStep, das wir an die Methode walkSteps übergeben und legen somit die Anzahl der Schritte fest die für einen Partikel gemacht werden. Wir übergeben außerdem numpar an drawTraces und legen so die Anzahl der Partikel fest, die gezeichnet werden sollen. Wir öffnen eine Grafik, der wir diesmal aber noch keine Daten übergeben sondern nur einen Namen und den Modus in dem gezeichnet werden soll. Die Daten weisen wir diesmal in einer for-Schleife zu, die als Zählervariable numpar erhält. In der Variable posArray speichern wir die Daten für einen Partikel, den wir mit Hilfe von fig.add_trace unserer Grafik zuweisen. Diesen Vorgang wiederholen wir so lange, bis wir unserer Grafik die Anzahl der vorgesehenen Partikel zugewiesen haben. Erst nachdem die for-Schleife komplett durchlaufen wurde rufen wir fig.show() auf, um uns die Grafik anzeigen zu lassen.
import numpy as np
import random as rd
import plotly.graph_objects as go
numpar = 1000
numStep = 100
NORTH = 1; SOUTH = 2; WEST = 3; EAST = 4
def singleStep():
position = np.zeros(shape=(2,), dtype=int)
currentStep = rd.randint(1, 4 + 1)
position[1] += np.where(currentStep == NORTH, 1, 0)
position[1] -= np.where(currentStep == SOUTH, 1, 0)
position[0] += np.where(currentStep == EAST, 1, 0)
position[0] -= np.where(currentStep == WEST, 1, 0)
return position
def walkSteps(numStep):
positionsArray = np.zeros(shape=(numStep+1, 2), dtype=int)
for step in np.arange(numStep):
positionsArray[step+1, ] = positionsArray[step, ] + singleStep()
return positionsArray
def drawTraces(numpar, numStep):
fig = go.Figure(data=go.Scatter(
mode='markers',
name='Draw pollen motion'))
for step in np.arange(numpar):
posArray = walkSteps(numStep)
fig.add_trace(
go.Scatter(
x=posArray[:, 0],
y=posArray[:, 1],
marker=dict(
color=np.arange(numpar),
size=5,
colorscale='Greens',
showscale=False)))
fig.update_layout(
autosize=False,
height=800,
width=1310)
fig.show()
def main():
drawTraces(500, 10)
if __name__ == "__main__":
main()
Als Ergbenis erhalten wir eine Grafik die uns jezt mehrere Partikel auf einmal anzeigt. Durch klicken auf den Namen eines Partikels können wir diesen entweder ein oder ausblenden und nachvollziehen welcher Partikel welche Farbe hat, da wir neben dem Namen auch eine Farbe angezeigt bekommen. Bei einer hohen Anzahl an Partikeln erkennt man, dass die Zahl der Ausreißer extrem gering ist, wenn die Zahl der Schritte gering ist. Erhöht man die Zahl der Schritte kann man erkennen, dass die Zahl der Partikel die sich aus der "Wolke lösen" deutlich höher ist als bei einer geringen Anzahl an Schritten.